﻿/*
    CommonUtilities.cs
    
    앱의 전체적인 부분에서 사용되는 메소드를 모아놓은 클래스
 */

using System;
using System.Collections;
using System.IO;
using System.IO.IsolatedStorage;
using System.Net;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using Microsoft.Phone.Shell;

namespace TodayHumor
{
    public static class Utilities
    {
        /// <summary>
        /// Page에 message에 해당하는 내용으로 ProgressIndicator를 띄웁니다.
        /// </summary>
        /// <param name="obj">ProgressIndicator를 띄울 Page입니다.</param>
        /// <param name="message">ProgressIndicator의 내용입니다.</param>
        public static void GeneratePI(DependencyObject obj, string message)
        {
            ProgressIndicator PI = new ProgressIndicator
            {
                Text = message,
                IsIndeterminate = true,
                IsVisible = true
            };
            SystemTray.SetProgressIndicator(obj, PI);
        }

        /// <summary>
        /// param으로 넘어온 ApplicationBarButton들을 AppBar에 설정합니다.
        /// </summary>
        /// <param name="AppBar">ApplicationBarButton들을 위치할 ApplicationBar입니다.</param>
        /// <param name="buttons">ApplicationBar 안에 위치한 버튼들입니다.</param>
        public static void SetApplicationBarButtons(IApplicationBar AppBar, params ApplicationBarIconButton[] buttons)
        {
            AppBar.Buttons.Clear();

            foreach (Microsoft.Phone.Shell.ApplicationBarIconButton button in buttons)
            {
                AppBar.Buttons.Add(button);
            }
        }

        /// <summary>
        /// 한 XAML 요소로부터 TargetType에 해당하는 첫 번째 요소를 찾습니다.
        /// </summary>
        /// <param name="parent">TargetType에 해당하는 요소를 찾을 XAML 요소입니다.</param>
        /// <param name="TargetType">찾을 Type입니다.</param>
        /// <returns>XAML 요소의 자식 중 TargetType에 해당하는 요소가 있으면 그 요소를, 없으면 null을 반환합니다.</returns>
        public static UIElement FindElement(FrameworkElement parent, Type TargetType)
        {
            // 반환할 요소입니다.
            UIElement FoundElement = null;

            // 해당 XAML 요소에 자식이 있는지 검사합니다.
            int childCount = VisualTreeHelper.GetChildrenCount(parent);
            if (childCount > 0)
            {
                // 자식이 있으면, 모든 요소들을 다 돌아가며 TargetType에 해당하는 요소가 있는지 검사합니다.
                for (int i = 0; i < childCount; i++)
                {
                    Object element = VisualTreeHelper.GetChild(parent, i);
                    // 해당 요소가 TargetType이면..
                    if (element.GetType() == TargetType)
                    {
                        return element as UIElement;
                    }
                    else
                    {
                        // 아니면 해당 요소의 자식들을 모두 돌아가며 TargetType 요소를 찾습니다.
                        FoundElement = FindElement(VisualTreeHelper.GetChild(parent, i) as FrameworkElement, TargetType);
                    }
                }
            }
            return FoundElement;
        }

        /// <summary>
        /// XAML 요소의 VisualState를 찾습니다. 없으면 null을 반환합니다.
        /// </summary>
        /// <param name="element">찾을 XAML 요소입니다.</param>
        /// <param name="name">VisualState의 이름입니다.</param>
        /// <returns>VisualState가 있으면 그 VisualState를, 없으면 null을 반환합니다.</returns>
        public static VisualStateGroup FindVisualState(FrameworkElement element, string name)
        {
            // 찾은 XAML 요소가 null이면 에러 발생하므로 null 반환
            if (element == null) { return null; }

            // XAML 요소의 VisualStateGroup을 찾아 모든 Group을 돌며 해당하는 VisualState를 찾습니다.
            IList groups = VisualStateManager.GetVisualStateGroups(element);
            foreach (VisualStateGroup group in groups)
            {
                if (group.Name == name)
                {
                    return group;
                }
            }

            return null;
        }
    }
}